package screw知识;

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.util.IdUtil;
import cn.smallbun.screw.core.Configuration;
import cn.smallbun.screw.core.engine.EngineConfig;
import cn.smallbun.screw.core.engine.EngineFileType;
import cn.smallbun.screw.core.engine.EngineTemplateType;
import cn.smallbun.screw.core.execute.DocumentationExecute;
import cn.smallbun.screw.core.process.ProcessConfig;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;

import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import javax.sql.DataSource;
import java.io.File;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.Arrays;
import java.util.Collections;

public class ScrewMain {

    private static final String DB_URL = "jdbc:mysql://10.197.0.67:3306/bladex?serverTimezone=Asia/Shanghai";
    private static final String DB_USERNAME = "root"; // 数据库用户名
    private static final String DB_PASSWORD = "root"; // 数据库密码

    // 文档生成配置
    private static final String FILE_OUTPUT_DIR = "/screw_test"; // 输出目录
    private static final EngineFileType FILE_OUTPUT_TYPE = EngineFileType.HTML; // 输出文件类型 (HTML 格式)
    private static final String DOC_FILE_NAME = "数据库文档"; // 文档名称
    private static final String DOC_VERSION = "1.1.1"; // 文档版本
    private static final String DOC_DESCRIPTION = "码农研究僧的阐述"; // 文档描述

    public static void main(String[] args) {
        // 创建 Screw 的配置
        Configuration config = Configuration.builder()
                .version(DOC_VERSION)               // 设置文档版本
                .description(DOC_DESCRIPTION)       // 设置文档描述
                .dataSource(buildDataSource())      // 配置数据源
                .engineConfig(buildEngineConfig())  // 配置引擎设置
                .produceConfig(buildProcessConfig()) // 配置处理逻辑
                .build();

        // 执行文档生成操作
        new DocumentationExecute(config).execute();
    }

    /**
     * 创建数据源配置
     * 配置 MySQL 数据库连接所需的参数，并使用 HikariCP 提供连接池管理。
     */
    private static DataSource buildDataSource() {
        // 创建 HikariCP 配置
        HikariConfig hikariConfig = new HikariConfig();
        hikariConfig.setDriverClassName("com.mysql.cj.jdbc.Driver"); // MySQL 驱动
        hikariConfig.setJdbcUrl(DB_URL);                            // 数据库 URL
        hikariConfig.setUsername(DB_USERNAME);                      // 数据库用户名
        hikariConfig.setPassword(DB_PASSWORD);                      // 数据库密码
        hikariConfig.addDataSourceProperty("useInformationSchema", "true"); // 启用获取表信息的功能

        // 创建数据源
        return new HikariDataSource(hikariConfig);
    }

    /**
     * 创建引擎配置
     * 配置文档生成引擎，指定输出文件的路径、类型等设置。
     */
    private static EngineConfig buildEngineConfig() {
        return EngineConfig.builder()
                .fileOutputDir(FILE_OUTPUT_DIR)  // 设置生成文件的输出路径
                .openOutputDir(false)            // 是否打开输出目录
                .fileType(FILE_OUTPUT_TYPE)      // 设置输出文件类型 (HTML)
                .produceType(EngineTemplateType.freemarker) // 使用 FreeMarker 模板引擎
                .fileName(DOC_FILE_NAME)         // 设置文件名
                .build();
    }

    /**
     * 创建处理配置
     * 配置需要生成的表格、忽略的表格、表格前缀和后缀等。
     * 这里可以根据需要进行定制。
     */
    private static ProcessConfig buildProcessConfig() {
        return ProcessConfig.builder()
                // 下面三个配置为指定生成的表格名称、前缀和后缀（可选）
                .designatedTableName(Collections.<String>emptyList())  // 没有指定表格名称
                .designatedTablePrefix(Collections.<String>emptyList()) // 没有指定表格前缀
                .designatedTableSuffix(Collections.<String>emptyList()) // 没有指定表格后缀
                // 忽略的表格配置
                .ignoreTableName(Arrays.asList("test_user", "test_group")) // 忽略这两个表
                .ignoreTablePrefix(Collections.singletonList("test_"))  // 忽略以 "test_" 开头的表格
                .ignoreTableSuffix(Collections.singletonList("_test")) // 忽略以 "_test" 结尾的表格
                .build();
    }

}